# Java 中算术移位与逻辑移位的区别
# 一、算术移位
算术移位,符号位不变。
符号位是 1,移位后还是 1。符号位是 0,移位后还是 0。
Java 中用 >>
和 <<
表示算术移位。
# 二、逻辑移位
逻辑移位后,符号位填充总是 0。
Java 中用 >>>
和 <<<
表示逻辑移位。
# 三、代码
public static void main(String []args) {
// 十进制正数: 8
// 0b 表示是个二进制
int n = 0b00000000000000000000000000001000;
System.out.println(n + " binary value: " + Integer.toBinaryString(n));
// 算术右移一位变为 4,高位用符号位 0 填充
System.out.println(n + " shift arithmetic right result: " + (n >> 1) + " binary value: " + Integer.toBinaryString(n >> 1));
// 逻辑右移一位,高位用 0 填充,因此正数没有影响
System.out.println(n + " shift logical right result: " + (n >>> 1) + " binary value: " + Integer.toBinaryString(n >>> 1));
// 十进制负数: -8
// 负数在计算机中用补码表示
int m = 0b11111111111111111111111111111000;
System.out.println(m + " binary value: " + Integer.toBinaryString(m));
// 算术右移一位变为 -4,高位用符号位 1 填充
System.out.println(m + " shift arithmetic right result: " + (m >> 1) + " binary value: " + Integer.toBinaryString(m >> 1));
// 逻辑右移一位,高位用 0 填充,打印忽略前面的 0 了,完整是:01111111111111111111111111111100
System.out.println(m + " shift logical right result: " + (m >>> 1) + " binary value: " + Integer.toBinaryString(m >>> 1));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 四、运行结果
8 binary value: 1000
8 shift arithmetic right result: 4 binary value: 100
8 shift logical right result: 4 binary value: 100
-8 binary value: 11111111111111111111111111111000
-8 shift arithmetic right result: -4 binary value: 11111111111111111111111111111100
-8 shift logical right result: 2147483644 binary value: 1111111111111111111111111111100
1
2
3
4
5
6
2
3
4
5
6